package control;

import model.Aresta;
import model.Cromossomo;

public class Otimo {
	
	public static void main(String[] args) {
		long tempoInicial=System.currentTimeMillis();
		Aresta[][] grafo=Leitura.ler();
		int n=grafo.length;
		Cromossomo melhor=null,segundoMelhor=null,melhorEmpresa=null,segundoMelhorEmpresa=null,teste;
		int[] inteiros1,inteiros2,inteiros3;
		
		inteiros1=new int[1];
		inteiros2=new int[2];
		inteiros3=new int[3];
		
		inteiros1[0]=-1;
		melhor=Cromossomo.criaCromossomo(inteiros1, n, grafo);
		melhorEmpresa=Cromossomo.criaCromossomo(inteiros1, n, grafo);
		for(int i=1;i<n-1;i++){
			inteiros1[0]=i;
			inteiros2[0]=i;
			inteiros3[0]=i;
			if(i==1){
				segundoMelhor=Cromossomo.criaCromossomo(inteiros1, n, grafo);
				segundoMelhorEmpresa=Cromossomo.criaCromossomo(inteiros1, n, grafo);
				if(segundoMelhor.GetAptidao()<melhor.GetAptidao()){
					teste=melhor;
					melhor=segundoMelhor;
					segundoMelhor=teste;
				}
				if(segundoMelhorEmpresa.getAptidaoEmpresa()<melhorEmpresa.getAptidaoEmpresa()){
					teste=melhorEmpresa;
					melhorEmpresa=segundoMelhorEmpresa;
					segundoMelhorEmpresa=teste;
				}
			}else{
				teste=Cromossomo.criaCromossomo(inteiros1, n, grafo);
				if(teste.GetAptidao()<melhor.GetAptidao()){
					segundoMelhor=melhor;
					melhor=teste;
				}else	if(teste.GetAptidao()<segundoMelhor.GetAptidao()){
							segundoMelhor=teste;
						}
				if(teste.getAptidaoEmpresa()<melhorEmpresa.getAptidaoEmpresa()){
					segundoMelhorEmpresa=melhorEmpresa;
					melhorEmpresa=teste;
				}else	if(teste.getAptidaoEmpresa()<segundoMelhorEmpresa.getAptidaoEmpresa()){
							segundoMelhorEmpresa=teste;
						}
			}
			for(int j=1;j<n-1;j++){
				if(j!=i){
					inteiros2[1]=j;
					inteiros3[1]=j;
					teste=Cromossomo.criaCromossomo(inteiros2, n, grafo);
					if(teste.GetAptidao()<melhor.GetAptidao()){
						segundoMelhor=melhor;
						melhor=teste;
					}else	if(teste.GetAptidao()<segundoMelhor.GetAptidao()){
								segundoMelhor=teste;
							}
					if(teste.getAptidaoEmpresa()<melhorEmpresa.getAptidaoEmpresa()){
						segundoMelhorEmpresa=melhorEmpresa;
						melhorEmpresa=teste;
					}else	if(teste.getAptidaoEmpresa()<segundoMelhorEmpresa.getAptidaoEmpresa()){
								segundoMelhorEmpresa=teste;
							}
					for(int k=1;k<n-1;k++){
						if(k!=i && k!=j){
							inteiros3[2]=k;
							teste=Cromossomo.criaCromossomo(inteiros3, n, grafo);
							if(teste.GetAptidao()<melhor.GetAptidao()){
								segundoMelhor=melhor;
								melhor=teste;
							}else	if(teste.GetAptidao()<segundoMelhor.GetAptidao()){
										segundoMelhor=teste;
									}
							if(teste.getAptidaoEmpresa()<melhorEmpresa.getAptidaoEmpresa()){
								segundoMelhorEmpresa=melhorEmpresa;
								melhorEmpresa=teste;
							}else	if(teste.getAptidaoEmpresa()<segundoMelhorEmpresa.getAptidaoEmpresa()){
										segundoMelhorEmpresa=teste;
									}
						}
					}
				}
			}
		}
		
		long tempoFinal=System.currentTimeMillis();
		long tempoTotal=tempoFinal-tempoInicial;
		System.out.println(tempoTotal);
		
		System.out.println("\naptid�o passageiros\n");
		System.out.println(melhor.stringComResultado()+" melhor: "+melhor.GetAptidao());
		System.out.println("escalas:"+melhor.getNumeroEscalas());
		System.out.println("pre�o total:"+melhor.getPrecoTotal());
		System.out.println("tempo total de viagem:"+melhor.getTempoViagemTotal());
		System.out.println("tempo total de espera:"+melhor.getTempoEsperaTotal());
		System.out.println("lota��o total:"+melhor.getLotacaoTotal()+"\n");
		
		System.out.println(segundoMelhor.stringComResultado()+" segunda melhor: "+segundoMelhor.GetAptidao());
		System.out.println("escalas:"+segundoMelhor.getNumeroEscalas());
		System.out.println("pre�o total:"+segundoMelhor.getPrecoTotal());
		System.out.println("tempo total de viagem:"+segundoMelhor.getTempoViagemTotal());
		System.out.println("tempo total de espera:"+segundoMelhor.getTempoEsperaTotal());
		System.out.println("lota��o total:"+melhor.getLotacaoTotal()+"\n");
		
		System.out.println("\naptid�o empresa\n");
		System.out.println(melhorEmpresa.stringComResultado()+" melhor: "+melhorEmpresa.getAptidaoEmpresa());
		System.out.println("escalas:"+melhorEmpresa.getNumeroEscalas());
		System.out.println("pre�o total:"+melhorEmpresa.getPrecoTotal());
		System.out.println("tempo total de viagem:"+melhorEmpresa.getTempoViagemTotal());
		System.out.println("tempo total de espera:"+melhorEmpresa.getTempoEsperaTotal());
		System.out.println("lota��o total:"+melhorEmpresa.getLotacaoTotal()+"\n");
		
		System.out.println(segundoMelhorEmpresa.stringComResultado()+" segunda melhor: "+segundoMelhorEmpresa.getAptidaoEmpresa());
		System.out.println("escalas:"+melhor.getNumeroEscalas());
		System.out.println("escalas:"+segundoMelhorEmpresa.getNumeroEscalas());
		System.out.println("pre�o total:"+segundoMelhorEmpresa.getPrecoTotal());
		System.out.println("tempo total de viagem:"+segundoMelhorEmpresa.getTempoViagemTotal());
		System.out.println("tempo total de espera:"+segundoMelhorEmpresa.getTempoEsperaTotal());
		System.out.println("lota��o total:"+segundoMelhorEmpresa.getLotacaoTotal()+"\n");
		
		System.out.println("\naptid�o da empresa nos melhores cromossomos dos passageiros\n");
		System.out.println(melhor.stringComResultado()+" melhor: "+melhor.getAptidaoEmpresa());
		System.out.println(segundoMelhor.stringComResultado()+" segunda melhor: "+segundoMelhor.getAptidaoEmpresa());
		
		double ganhoEmpresa=melhor.getAptidaoEmpresa()/melhorEmpresa.getAptidaoEmpresa();
		if(ganhoEmpresa>1){
			System.out.println("A empresa perderia "+(ganhoEmpresa-1)*100+"%");
		}else if(ganhoEmpresa<1){
			System.out.println("A empresa lucraria "+(1-ganhoEmpresa)*100+"%");
		}else{
			System.out.println("Tanto faz");
		}
	
		
		
		
		System.exit(0);
	}
	
}
